#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "tp2.h"

  /*
   * Ao final da insercao bem sucedida de uma obra,
   * essa funcao eh ativada para carregar a chave
   * primaria da obra recem inserida, para que possa
   * ser encontrada em uma posterior pesquisa.
   */
  void AdicionaPK(PK *lista,char *nome,int reg){
    int a;
    for(a=0;a<200;a++){
      lista[reg-1].titulo[a]=nome[a];
    }
    lista[reg-1].NRR=reg-1;
  /*
   * Como utilizamos vetores multiplos de 20,
   * quando ele esta "cheio" deve-se realloca-lo
   * com mais 20 espacos, para inserir chaves
   * primarias.
   */
    if(reg%20==0){
      lista=(PK*)realloc(lista,(reg+20)*sizeof(PK));
    }
  /*
   * Ordena a lista ao final da insercao.
   */
    Ordena(lista,0,reg-1);
    return;
  }

  /*
   * Se existir o arquivo contendo as chaves primarias,
   * essa funcao carrega a lista desse arquivo no
   * inicio da execucao.
   */
  PK* CarregaPK(int *nu,FILE *arq){
    PK *lista;
    int i=0,mult;
    fread(nu,1,4,arq);
    mult=(*nu)/20;
    if((*nu)%20!=0){
      mult++;
    }
    mult=mult*20;
    lista=(PK*)malloc(mult*sizeof(PK));
    for(i=0;i<(*nu);i++){
      fseek(arq,i*204,4);
      fread(lista[i].titulo,1,200,arq);
      fseek(arq,(i*204)+200,4);
      fread(&(lista[i].NRR),1,4,arq);
    }
    return lista;    
  }

  /*
   * Caso nao haja o arquivo de chaves primarias,
   * essa funcao carrega-os diretamente da base
   * de dados.
   */
  PK* CarregaPKDaBase(int *reg, FILE *arq){
    PK *lista;
    int i=0,fulllist=0,a;
    char buffer[200];
    lista=(PK*)malloc(20*sizeof(PK));
    while(fgets(buffer,200,arq)!=NULL){
      fseek(arq,i*450,0);
      fread(buffer,1,200,arq);
  /*
   * Caso o vetor multiplo de 20 fique "cheio"
   * deve se alocar mais espaco para futuras
   * insercoes.
   */
      if(fulllist==20){
        lista=(PK*)realloc(lista,sizeof(PK)*(i+20));
        fulllist=0;
      }
      for(a=0;a<200;a++){
        lista[i].titulo[a]=buffer[a];
      }
      lista[i].NRR=i;
      i++;
      fulllist++;
      fseek(arq,i*450,0);
    }
  /*
   * Como a ordem de obras na base eh por ordem
   * de "chegada", deve-se ordenar a lista de chaves
   * primarias por ordem alfabetica.
   */
    if(i>0){
      Ordena(lista,0,i-1);
    }
    *reg=i;
    return lista;
  }
                                                                                                                                                                                                      
